package com.luxsoft.siipap.em.replica.importadores.inventarios;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.lang.time.DateUtils;
import org.apache.log4j.Logger;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;

import com.luxsoft.siipap.em.replica.ReplicationUtils;
import com.luxsoft.siipap.em.replica.importadores.ImportadorSupport;
import com.luxsoft.siipap.em.replica.importadores.dbf.DBFReaderTemplate;
import com.luxsoft.siipap.em.replica.importadores.dbf.DBFRowHandler;
import com.luxsoft.siipap.inventarios.model.Inventario;
import com.luxsoft.siipap.inventarios.model.MovimientoDet;
import com.luxsoft.siipap.model.Periodo;
import com.luxsoft.siipap.model.Sucursal;
import com.luxsoft.siipap.service.ServiceLocator2;
import com.luxsoft.siipap.util.DBUtils;
import com.luxsoft.siipap.util.DateUtil;

/**
 * Pendiente (Mejora al que funciona con DBF's
 * 
 * @author Ruben Cancino
 *
 */
public class ImportadorDeTPE_TPS2 implements RowCallbackHandler{
	
	
	
	private Logger logger=Logger.getLogger(getClass());
	
	
	private  Sucursal sucursal;
	
	public ImportadorDeTPE_TPS2(){		
	}
	
	private DataSource getDataSource(){
		BasicDataSource ds=new BasicDataSource();
		ds.setDriverClassName("sun.jdbc.odbc.JdbcOdbcDriver");
		ds.setUrl("jdbc:odbc:SIIPAP");
		return ds;
	}
	
	
	public void importar(Date fecha,int sucursalClave){
		logger.info("Importando movimientos fac para:"+fecha);
		this.sucursal=ImportadorSupport.getInstance().buscarSucursal(sucursalClave);
		
		String sql=ReplicationUtils.resolveSQL(new Periodo(fecha), "ALMACE", "ALMFECHA");
		sql=sql+" AND ALMSUCUR=@SUCUR AND ALMTIPO IN(\'TPE\',\'TPS\') ";
		sql=sql.replaceAll("@SUCUR",String.valueOf(sucursalClave));
		System.out.println("Ejecutando: "+sql);
		JdbcTemplate template=new JdbcTemplate(getDataSource());
		template.query(sql, this);
	}
	
	
	public void processRow(ResultSet rs) throws SQLException {
		
		MovimientoDet sal=new MovimientoDet();
		sal.setConcepto(rs.getString("ALMTIPO"));
		sal.setDocumento(rs.getLong("ALMNUMER"));
		sal.setCantidad(rs.getDouble("ALMCANTI"));
		sal.setClave(rs.getString("ALMARTIC"));
		String comentario=rs.getString("ALMOBSER");
		sal.setComentario(comentario);		
		sal.setFecha(rs.getDate("ALMFECHA"));
		sal.setRenglon(rs.getInt("ALMRENGL"));
		sal.setProducto(ImportadorSupport.getInstance().buscarProducto(sal.getClave().trim()));					
		sal.setSucursal(sucursal);
		persistir(sal);
		
	}

	
	public void persistir(Inventario inv){
		
		try {
			ServiceLocator2.getUniversalDao().save(inv);
			actualizarExistencia(inv);
			System.out.println("Importado: "+inv);
		} catch (DataIntegrityViolationException de) {
			logger.info("Movimiento existente: "+inv+ "\n"+de.getRootCause().getMessage());
		}
	}
	
	private void actualizarExistencia(final Inventario inv){
		try {
			int year=Periodo.obtenerYear(inv.getFecha());
			int mes=Periodo.obtenerMes(inv.getFecha())+1;
			ServiceLocator2.getExistenciaDao().actualizarExistencias(inv.getClave(),year,mes);
		} catch (Exception e) {
			logger.error("Error actualizando existencia para : "+inv.getClave());
		}
	}
	
	
	
	public static void main(String[] args) {
		DBUtils.whereWeAre();
		ImportadorDeTPE_TPS2 importador=new ImportadorDeTPE_TPS2();
		importador.importar(DateUtil.toDate("03/02/2010"),6);
		
	}

	
}
